package com.song.eureka.consumer.ribbon.hystrix.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

/**
 * 
 * @description : 改造服务消费方式，新增ConsumerService类，然后将在Controller中的逻辑迁移过去。最后，在为具体执行逻辑的函数上增加@HystrixCommand注解来指定服务降级方法
 * @date        : 2018-08-10 16:25
 * @author      : leoSong
 *
 */
@Service
public class ConsumerService {
  @Autowired
  RestTemplate restTemplate;
  
  /**
   * 重启eureka-client之后，再尝试访问localhost:2101/consumer，此时我们将获得的返回结果为：fallback。
   * 我们从eureka-client的控制台中，可以看到服务提供方输出了原本要返回的结果，但是由于返回前延迟了5秒，而服务消费方触发了服务请求超时异常，
   * 服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行，因此该请求的结果返回了fallback。这样的机制，对自身服务起到了基础的保护，
   * 同时还为异常情况提供了自动的服务降级切换机制。
   * @date    : 2018-08-10 16:46
   * @author  : leoSong
   * @return
   */
  @HystrixCommand(fallbackMethod = "fallback")
  public String consumer() {
      return restTemplate.getForObject("http://eureka-client/dc", String.class);
  }

  public String fallback() {
      return "fallback";
  }

}
